// Package action 包含 GORM 所有的操作函数和方法
package action

import (
	"fmt"
	"github.com/Ming0706/gorm/internal"
	"time"
)

// User 跨包写方法需要在本包重新定义一个自定义类型: type myT 其他包.T
type User internal.User

// CreateTable 创建表
func CreateTable() {
	// 如果数据库中没有users表就创建
	if !internal.DB.HasTable(&internal.User{}) {
		// 直接通过 DB.CreateTable 就可以创建表了，非常方便
		// 还可以通过 DB.Set 设置一些额外的属性
		if err := internal.DB.
			Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").
			CreateTable(&internal.User{}).Error; err != nil {
			panic(err)
		}
		fmt.Printf("新增user表成功！\n")
	}
}

// Action 函数用于对数据库进行操作
// act: insert delete update query prepareQuery
func Action(act string) {
	switch act {
	case "insert":
		// 新建一个 user 的结构体变量
		// 用 internal.User 的原因是本包中自定义类型 User 不能使用定义在 internal 包中的 User 结构体的方法
		newUser := internal.User{
			Name:       "闫宝金",
			Age:        23,
			CreateTime: time.Now(),
		}
		if err := newUser.InsertUser(); err != nil {
			fmt.Printf("新增数据错误！\nError: %v\n", err)
		}
		fmt.Printf("新增user结构体主键是%v\n", newUser.Id)
	case "delete":
		// 定义需要删除的结构体，主键字段必须有值
		user := internal.User{Id: 1}
		// delete from user where id = 1;
		if err := user.DeleteUser(); err != nil {
			return
		}
	case "del":
		Delete()
	case "update":
		// 需要修改的数据库对应记录的 user结构体
		updateUser := internal.User{
			Id:   1,
			Name: "李欣伟",
			Age:  22,
		}
		if err := updateUser.UpdateUser(); err != nil {
			fmt.Printf("更新数据错误！\nError: %v\n", err)
		}
		fmt.Printf("更新后的数据：%v\n", updateUser)
	case "modelUpdate":
		Update()
	case "save":
		// 需要修改的数据库对应记录的 user结构体
		saveUser := User{
			Id:         1,
			Name:       "李欣伟",
			Age:        22,
			CreateTime: time.Now(),
		}
		if err := saveUser.SaveUser(); err != nil {
			fmt.Printf("更新数据错误！\nError: %v\n", err)
		}
		fmt.Printf("更新后的数据：%v\n", saveUser)
	case "query":
		GormQuery()
	case "whereQuery":
		WhereQuery()
	case "notQuery":
		NotQuery()
	case "orQuery":
		OrQuery()
	case "selectQuery":
		SelectQuery()
	case "order":
		Order()
	case "limit":
		Limit()
	case "count":
		Count()
	case "group":
		GroupAndHaving()
	case "join":
		Join()
	//	// 需要查询的数据对应记录的 user结构体，id不能为空
	//	queryUser := internal.User{
	//		Id: 3,
	//	}
	//	Query(queryUser)
	//case "prepareQuery":
	//	// 预处理查询
	//	PrepareQuery(0)
	//case "prepareInsert":
	//	// 预处理批量插入
	//	PrepareInsert()
	//case "trans":
	//	// MySQl事务处理
	//	Trans()
	default:
		// 需要查询的数据对应记录的 user结构体，id不能为空
		//QueryRows(2)
		fmt.Printf("你是啥也不做啊！\n")
	}
}
